/**
 * 版权所有 (C), 2019-2019, XXX有限公司
 * 项目名：com.company.study.dsa.array
 * 文件名: MyArray
 * 日期: 2019/6/16 20:58
 * 说明:
 */
package com.company.study.dsa.array;

/**
 * @author Anbang713
 * @create 2019/6/16
 */
public class MyArray {

    //默认数组最大长度为50
    private static final int DEFAULT_LENGTH = 50;

    //定义一个数组
    private int[] intArray;
    //定义数组的实际有效长度
    private int elemSize;
    //定义数组的最大长度
    private int length;

    /**
     * 默认构造方法，将初始化一个长度为DEFAULT_LENGTH的数组
     */
    public MyArray() {
        this(DEFAULT_LENGTH);
    }

    /**
     * 构造方法，初始化一个指定长度的数组
     *
     * @param length 长度
     */
    public MyArray(int length) {
        elemSize = 0;
        this.length = length;
        intArray = new int[length];
    }

    /**
     * 获取数组的实际有效长度
     *
     * @return
     */
    public int getSize() {
        return this.elemSize;
    }

    /**
     * 遍历显示数组中的元素
     */
    public void display() {
        for (int i = 0; i < elemSize; i++) {
            System.out.print(intArray[i] + " ");
        }
        System.out.println();
    }

    /**
     * 添加元素
     *
     * @param value 假设操作人是不会添加重复元素的，如果有重复元素对于后面的操作都会有影响。
     * @return 添加成功返回true, 添加的元素超过范围了返回false。
     */
    public boolean add(int value) {
        if (elemSize == length) {
            return false;
        }
        intArray[elemSize++] = value;
        return true;
    }

    /**
     * 根据下标获取元素
     *
     * @param index 下标
     * @return 返回下标所表示的元素
     * @throws Exception 下标小于0，或者大于数组实际元素长度，抛出异常
     */
    public int get(int index) throws Exception {
        if (index < 0 || index > elemSize) {
            throw new Exception("访问下标越界");
        }
        return intArray[index];
    }

    /**
     * 查找元素
     *
     * @param searchValue 待匹配的元素
     * @return 返回待匹配元素的下标值，如果不存在，则返回-1
     */
    public int find(int searchValue) {
        int index;
        for (index = 0; index < elemSize; index++) {
            if (intArray[index] == searchValue) {
                break;
            }
        }
        if (index == elemSize) {
            return -1;
        }
        return index;
    }

    /**
     * 删除元素
     *
     * @param value 待删除的值
     * @return 如果删除的值不存在，则返回false；否则返回true，表示删除成功。
     */
    public boolean delete(int value) {
        int index = find(value);
        if (index == -1) {
            return false;
        }
        if (index != elemSize - 1) {
            for (int i = index; i < elemSize - 1; i++) {
                intArray[i] = intArray[i + 1];
            }
        }
        elemSize--;
        return true;
    }

    /**
     * 修改数组
     *
     * @param oldValue 原值
     * @param newValue 新值
     * @return 修改成功返回true，false表示修改失败
     */
    public boolean modify(int oldValue, int newValue) {
        int index = find(oldValue);
        if (index == -1) {
            return false;
        }
        intArray[index] = newValue;
        return true;
    }
}